import { Response } from '@angular/http';

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/throw';
//import 'rxjs/add/operator/catch';

class errorObject {
  status: number;
  message: string;
}

export class HttpUtils {
  // http 返回 状态码 策略
  // 有效请求，返回状态码 200，响应体 {"code": 200|401|404|等能用标准状态码表示的状态码|自定义状态码, "data": {}|[]}
  // 请求地址不存在，返回状态码 404
  // 服务器异常，返回状态码 500|其他服务器异常的状态码
  // 请求超时，返回状态码 504
  // 网络异常，返回状态码 0 断网

  static extractData (res: Response) {
    let body = res.json();
    if (body.code !== 200) {
      throw res;
    }
    return body.data || {};
  }

  static handleError (error: Response | any) {
    // 请求 异常 的处理
    // 异常分为 逻辑异常(-1)，系统异常，不可控异常(undefined)
    // 逻辑异常：请求正常响应，但是响应的不是想要的数据。是包含其他错误code的响应数据。
    //    需要响应给用户，给用户明确的指示，发生什么，要怎么做才能解决这个问题。
    //    如密码错误
    // 系统异常：可预见的请求异常，如请求地址不存在404等
    //    需要告知用户发生了什么情况，且通知开发人员，可发起请求，或其他方式。
    //    如发起异常报告，参数为响应体内容
    // 不可控异常：指有些执行时抛出的异常，如返回值不是json格式，但是执行了json反序列号，就会抛这种异常
    //    需要告诉用户发生了什么情况，且通知开发人员，可发起请求，或其他方式。
    //    如发起异常报告，参数异常的内容

    if (!(error instanceof Response)) {
      // 不可控异常
      return Observable.throw({
        message: error.message ? error.message : error.toString()
      });
    }

    let status = error.status;
    switch (status) {
      case 200:
        return Observable.throw({
          status: -1,
          message: error.json().code
        });
      default :
        return Observable.throw({
          status: status,
          message: status
        });
    }
  }

  static getErrorMessage (code) {
    if (typeof code === 'undefined') {
      return 'uncontrollableException';
    }
    return 'exceptionCode' + code;
  }
}

